# pip install sqlalchemy

from sqlalchemy import create_engine, Column, Integer, String, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# Определяем базу данных
DATABASE_URL = "sqlite:///./test.db"

# Создаем объект engine для подключения к базе данных
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})

# Создаем базовый класс для определения таблиц
Base = declarative_base()

# Определяем модель данных (таблицу)
class Item(Base):
    __tablename__ = 'items'

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    description = Column(String, index=True)
    price = Column(Float)

# Создаем таблицы в базе данных
Base.metadata.create_all(bind=engine)

# Создаем объект SessionLocal для взаимодействия с базой данных
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# Функция для создания нового предмета
def create_item(db, item_name, item_description, item_price):
    db_item = Item(name=item_name, description=item_description, price=item_price)
    db.add(db_item)
    db.commit()
    db.refresh(db_item)
    return db_item

# Функция для получения всех предметов
def get_items(db):
    return db.query(Item).all()

# Функция для получения предмета по ID
def get_item_by_id(db, item_id):
    return db.query(Item).filter(Item.id == item_id).first()

# Функция для обновления предмета
def update_item(db, item_id, item_name=None, item_description=None, item_price=None):
    db_item = db.query(Item).filter(Item.id == item_id).first()
    if db_item:
        if item_name:
            db_item.name = item_name
        if item_description:
            db_item.description = item_description
        if item_price:
            db_item.price = item_price
        db.commit()
        db.refresh(db_item)
    return db_item

# Функция для удаления предмета
def delete_item(db, item_id):
    db_item = db.query(Item).filter(Item.id == item_id).first()
    if db_item:
        db.delete(db_item)
        db.commit()
    return db_item

# Основной блок программы
if __name__ == "__main__":
    # Создаем сессию
    db = SessionLocal()

    # Пример создания нового предмета
    new_item = create_item(db, "Sample Item", "This is a sample item", 9.99)
    print(f"Created Item: ID: {new_item.id}, Name: {new_item.name}, Description: {new_item.description}, Price: {new_item.price}")

    # Пример получения всех предметов
    items = get_items(db)
    print("All Items:")
    for item in items:
        print(f"ID: {item.id}, Name: {item.name}, Description: {item.description}, Price: {item.price}")

    # Пример получения предмета по ID
    item = get_item_by_id(db, new_item.id)
    print(f"Item by ID: ID: {item.id}, Name: {item.name}, Description: {item.description}, Price: {item.price}")

    # Пример обновления предмета
    updated_item = update_item(db, new_item.id, item_name="Updated Item", item_price=19.99)
    print(f"Updated Item: ID: {updated_item.id}, Name: {updated_item.name}, Description: {updated_item.description}, Price: {updated_item.price}")

    # Пример удаления предмета
    deleted_item = delete_item(db, new_item.id)
    print(f"Deleted Item: ID: {deleted_item.id}, Name: {deleted_item.name}, Description: {deleted_item.description}, Price: {deleted_item.price}")

    # Закрываем сессию
    db.close()
